package com.example.demo.support;

import com.google.common.collect.Maps;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.List;
import java.util.Map;

@EqualsAndHashCode(callSuper = true)
@Data
public class IMQueryUserInfoResponse extends IMBaseResponse {

    private static final Map<Integer, String> ERROR_CODE_MESSAGE = Maps.newHashMap();

    static {
        ERROR_CODE_MESSAGE.put(40001, "请求参数错误，请根据错误描述检查请求参数");
        ERROR_CODE_MESSAGE.put(40002, "请求参数错误，没有指定 To_Account");
        ERROR_CODE_MESSAGE.put(40003, "请求的用户帐号不存在");
        ERROR_CODE_MESSAGE.put(40004, "请求需要 App 管理员权限");
        ERROR_CODE_MESSAGE.put(40006, "服务器内部错误，请稍后重试");
        ERROR_CODE_MESSAGE.put(40007, "没有资料字段的读权限，详情可参见 资料字段");
        ERROR_CODE_MESSAGE.put(40009, "资料字段的 Tag 不存在");
    }

    @Data
    public static class UserProfile {
        // 返回的用户的 Identifier
        private String To_Account;
        // 返回的用户的资料对象数组，数组中每一个对象都包含了 Tag 和 Value
        private List<Profile> ProfileItem;
        // To_Account 的处理结果，0表示成功，非0表示失败
        private Integer ResultCode;
        // To_Account 的错误描述信息，成功时该字段为空
        private String ResultInfo;
    }

    @Data
    public static class Profile {
        /**
         * Tag_Profile_IM_Nick	string	昵称	有	长度不得超过500个字节
         * Tag_Profile_IM_Gender	string	性别	有	Gender_Type_Unknown：没设置性别
         * Gender_Type_Female：女性
         * Gender_Type_Male：男性
         * Tag_Profile_IM_BirthDay	uint32	生日	有	推荐用法：20190419
         * Tag_Profile_IM_Location	string	所在地	有	长度不得超过16个字节，推荐用法如下：
         * App 本地定义一套数字到地名的映射关系
         * 后台实际保存的是4个 uint32_t 类型的数字
         * 其中第一个 uint32_t 表示国家
         * 第二个 uint32_t 用于表示省份
         * 第三个 uint32_t 用于表示城市
         * 第四个 uint32_t 用于表示区县
         * Tag_Profile_IM_SelfSignature	string	个性签名	有	长度不得超过500个字节
         * Tag_Profile_IM_AllowType	string	加好友验证方式	有	AllowType_Type_NeedConfirm：需要经过自己确认才能添加自己为好友
         * AllowType_Type_AllowAny：允许任何人添加自己为好友
         * AllowType_Type_DenyAny：不允许任何人添加自己为好友
         * Tag_Profile_IM_Language	uint32	语言	有	无
         * Tag_Profile_IM_Image	string	头像URL	有	长度不得超过500个字节
         * Tag_Profile_IM_MsgSettings	uint32	消息设置	有	标志位：
         * Bit0：置0表示接收消息，置1则不接收消息
         * Tag_Profile_IM_AdminForbidType	string	管理员禁止加好友标识	有	AdminForbid_Type_None：默认值，允许加好友
         * AdminForbid_Type_SendOut：禁止该用户发起加好友请求
         * Tag_Profile_IM_Level	uint32	等级	有	建议拆分以保存多种角色的等级信息
         * Tag_Profile_IM_Role	uint32	角色	有	建议拆分以保存多种角色信息
         */
        // 返回的资料对象的名称
        private String Tag;
        // 拉取的资料对象的值
        private Object Value;
    }

    // 返回处理失败的用户列表，仅当存在失败用户时才返回该字段
    protected List<String> Fail_Account;
    // 详细的客户端展示信息
    protected String ErrorDisplay;
    // 返回的用户资料结构化信息
    protected List<UserProfile> UserProfileItem;

    @Override
    public String transformErrorCode(Integer errorCode) {
        String message = super.transformErrorCode(errorCode);
        if (message != null) {
            return message;
        }
        return ERROR_CODE_MESSAGE.getOrDefault(errorCode, "未知错误");
    }
}
